﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using FrbaCommerce;

namespace FrbaCommerce.Login
{
    public partial class frm_login : Form
    {
        public frm_login()
        {
            InitializeComponent();
        }

        private void frm_login_Load(object sender, EventArgs e)
        {
            if ((txt_usuario.Text == "") && (txt_contrasenia.Text == ""))
                btn_ingresar.Enabled = false;
        }

        //---Habilitar boton Ingresar---//
        private void txt_usuario_TextChanged(object sender, EventArgs e)
        {
            if ((txt_usuario.Text != "") && (txt_contrasenia.Text != ""))
                btn_ingresar.Enabled = true;
            else
                btn_ingresar.Enabled = false;

        }

        private void txt_contrasenia_TextChanged(object sender, EventArgs e)
        {
            if ((txt_usuario.Text != "") && (txt_contrasenia.Text != ""))
                btn_ingresar.Enabled = true;
            else
                btn_ingresar.Enabled = false;
        }
        //---Habilitar boton Ingresar---//

        private void btn_ingresar_Click(object sender, EventArgs e)
        {
            if ((txt_usuario.Text != "") && (txt_contrasenia.Text != ""))
            {
                BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.CommandText = "LOS_GDDES.SP_VALIDAR_USUARIO_CONTRASENIA";
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@username", txt_usuario.Text);
                string contraseniaEncriptada = Encriptar.SHA256(txt_contrasenia.Text);
                sqlCommand.Parameters.AddWithValue("@password", contraseniaEncriptada);
                DataTable dt_usuario = baseDeDatos.consulta(sqlCommand);

                if (dt_usuario.Rows.Count > 0)
                {
                    DataRow dr_usuario = dt_usuario.Rows[0];
                    baseDeDatos.idUsuario = Convert.ToInt32(dr_usuario.Field<Decimal>("ID_USUARIO"));
                    
                    sqlCommand.CommandText = "LOS_GDDES.SP_RESETEAR_INTENTOS_FALLIDOS_USUARIO";
                    sqlCommand.CommandType = CommandType.StoredProcedure;
                    sqlCommand.Parameters.Clear();
                    sqlCommand.Parameters.AddWithValue("@id_usuario", baseDeDatos.idUsuario);
                    baseDeDatos.ejecuta(sqlCommand);

                    if (dr_usuario.Field<Boolean>("PRIMER_ACCESO"))
                    {
                        frm_cambiarContrasenia frm_cambiarContrasenia = new frm_cambiarContrasenia();
                        frm_cambiarContrasenia.Controls.OfType<Button>().Single<Button>(button => button.Name == "btn_cancelar").Enabled = false;
                        frm_cambiarContrasenia.ShowDialog();

                        sqlCommand.CommandText = "UPDATE LOS_GDDES.USUARIOS SET " +
                                                 "PRIMER_ACCESO = 0 WHERE ID_USUARIO = @id_usuario";
                        sqlCommand.CommandType = CommandType.Text;
                        sqlCommand.Parameters.Clear();
                        sqlCommand.Parameters.AddWithValue("@id_usuario", baseDeDatos.idUsuario);
                        baseDeDatos.ejecuta(sqlCommand);
                    }

                    sqlCommand.CommandText = "LOS_GDDES.SP_USUARIO_CANTIDAD_ROLES";
                    sqlCommand.CommandType = CommandType.StoredProcedure;
                    sqlCommand.Parameters.Clear();
                    sqlCommand.Parameters.AddWithValue("@id_usuario", baseDeDatos.idUsuario);
                    int cantRoles = baseDeDatos.ejecuta(sqlCommand);

                    if (cantRoles > 1)
                    {
                        frm_seleccionarRol frm_seleccionarRol = new frm_seleccionarRol();
                        frm_seleccionarRol.ShowDialog();
                        this.Close();
                    }
                    else
                    {
                        sqlCommand.CommandText = "LOS_GDDES.SP_TRAER_ROLES_X_USUARIO";
                        sqlCommand.CommandType = CommandType.StoredProcedure;
                        sqlCommand.Parameters.Clear();
                        sqlCommand.Parameters.AddWithValue("@id_usuario", baseDeDatos.idUsuario);
                        DataTable dt_roles = baseDeDatos.consulta(sqlCommand);
                        if (dt_roles.Rows.Count != 0)
                        {
                            baseDeDatos.idRol = Convert.ToInt32(dt_roles.Rows[0].Field<Decimal>("ID_ROL"));
                            frm_menu frm_menu = new frm_menu();
                            frm_menu.ShowDialog();
                        }
                        else
                            MessageBox.Show("Usted no posee Roles");

                        this.Close();
                    }
                }
                else
                {
                    sqlCommand.CommandText = "LOS_GDDES.SP_INCREMENTAR_INTENTOS_FALLIDOS";
                    sqlCommand.CommandType = CommandType.StoredProcedure;
                    sqlCommand.Parameters.Clear();
                    sqlCommand.Parameters.AddWithValue("@usuario", txt_usuario.Text);
                    baseDeDatos.ejecuta(sqlCommand);
                    MessageBox.Show("ERROR: El usuario y/o contraseña son incorrectos, o el usuario se encuentra inhabilitado.");
                }
            }
        }

        private void btn_cancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
